package ao.com.bna.controle;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import javax.swing.JOptionPane;

import ao.com.bna.beans.BoleanDesconto;
import ao.com.bna.beans.ExtensaoProcesso;
import ao.com.bna.beans.Processo;
import ao.com.bna.beans.ProcessoEstado;
import ao.com.bna.beans.TipoMoeda;
import ao.com.bna.beans.TipoNotificacao;
import ao.com.bna.beans.Transgressor;
import ao.com.bna.dao.BoleanDescontoDao;
import ao.com.bna.dao.ExtensaoProcessoDao;
import ao.com.bna.dao.ProcessoDao;
import ao.com.bna.dao.ProcessoEstadoDao;
import ao.com.bna.dao.TipoMoedaDao;
import ao.com.bna.dao.TipoNotificacaoDao;
import ao.com.bna.dao.TransgressorDao;
import ao.com.bna.util.BeanFactory;

/**
 * @see ManagedBean para manipular dados da pagina xhtml
 */
@ManagedBean(name = "processo")
@SessionScoped
public class ProcessoControle {

	private Processo processoEntity = new Processo();
	private ProcessoDao processoDao = (ProcessoDao) BeanFactory.getBean(
			"processoDao", ProcessoDao.class);

	// ***** Transgressor
	private Transgressor transgressorEntity = new Transgressor();
	private TransgressorDao transgressorDao = (TransgressorDao) BeanFactory
			.getBean("transgressorDao", TransgressorDao.class);

	// ***** ProcessoEstado
	private ProcessoEstado processoEstadoEntity = new ProcessoEstado();
	private ProcessoEstadoDao processoEstadoDao = (ProcessoEstadoDao) BeanFactory
			.getBean("processoEstadoDao", ProcessoEstadoDao.class);

	// ***** TipoNotificacao
	private TipoNotificacao tipoNotificacaoEntity = new TipoNotificacao();
	private TipoNotificacaoDao tipoNotificacaoDao = (TipoNotificacaoDao) BeanFactory
			.getBean("tipoNotificacaoDao", TipoNotificacaoDao.class);

	// ***** TipoMoeda
	private TipoMoeda tipoMoedaEntity = new TipoMoeda();
	private TipoMoedaDao tipoMoedaDao = (TipoMoedaDao) BeanFactory.getBean(
			"tipoMoedaDao", TipoMoedaDao.class);

	private Long transgressorId;
	private Long processoEstadoId;
	private Long tipoNotificacaoId;
	private Long tipoMoedaId;
	private long diaEntreDuasDatas;

	private DataModel model;

	private Date dataSistema, dataDefesa;

	/**
	 * @see Metodo ListaProcessos retorna todos dos Processo.
	 */
	public DataModel getListaProcessos() {
		model = new ListDataModel(processoDao.listar());
		return model;

	}

	/**
	 * @see Metodo salvarProcesso
	 */
	public String salvarProcesso() {
		String s = "listaProcesso";
		try {

			transgressorEntity = transgressorDao.obterPorID(transgressorId);
			processoEntity.setTransgressor(transgressorEntity);

			processoEstadoEntity = processoEstadoDao
					.obterPorID(processoEstadoId);
			processoEntity.setProcessoEstado(processoEstadoEntity);

			tipoNotificacaoEntity = tipoNotificacaoDao
					.obterPorID(tipoNotificacaoId);
			processoEntity.setTipoNotificacao(tipoNotificacaoEntity);

			tipoMoedaEntity = tipoMoedaDao.obterPorID(tipoMoedaId);
			processoEntity.setTipoMoeda(tipoMoedaEntity);

			processoDao = (ProcessoDao) BeanFactory.getBean("processoDao",
					ProcessoDao.class);
			processoDao.gravar(processoEntity);
			processoEntity = new Processo();
			/*
			 * processoEntity.setDataDeApreensao(null);
			 * processoEntity.setMontante(null);
			 * processoEntity.setNumOficio("");
			 * processoEntity.setDataAberturaProcesso(null);
			 */

			transgressorId = new Long(0);
			processoEstadoId = new Long(0);
			tipoNotificacaoId = new Long(0);
			tipoMoedaId = new Long(0);

			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"SALVOU COM SUCESSO", "Processo "));

		} catch (Exception e) {
			e.printStackTrace();
			s = "falhou";
			// mostrar o erro no faces
			String msg = e.getCause().toString();
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_FATAL, msg,
							"Processo"));

		}
		return s;
	}

	/**
	 * @see Metodo navegaCriarProcesso vai para pagina criarProcesso.xhtml
	 */
	public String navegaCriarProcesso() {
		String t = "criaProcesso";

		processoEntity = new Processo();

		transgressorId = new Long(0);
		processoEstadoId = new Long(0);
		tipoNotificacaoId = new Long(0);
		tipoMoedaId = new Long(0);

		// retorna o nome da pagina Criar Processo
		return t;

	}

	/**
	 * @see Metodo editarProcesso
	 */
	public String editarProcesso() {
		String r = "listaProcesso";
		try {

			transgressorEntity = transgressorDao.obterPorID(transgressorId);
			processoEntity.setTransgressor(transgressorEntity);

			processoEstadoEntity = processoEstadoDao
					.obterPorID(processoEstadoId);
			processoEntity.setProcessoEstado(processoEstadoEntity);

			tipoNotificacaoEntity = tipoNotificacaoDao
					.obterPorID(tipoNotificacaoId);
			processoEntity.setTipoNotificacao(tipoNotificacaoEntity);

			tipoMoedaEntity = tipoMoedaDao.obterPorID(tipoMoedaId);
			processoEntity.setTipoMoeda(tipoMoedaEntity);

			System.out.println("************  "
					+ processoEntity.getDataEntregaNotificacao());

			processoDao = (ProcessoDao) BeanFactory.getBean("processoDao",
					ProcessoDao.class);
			processoDao.actualiza(processoEntity);

			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"EDITOU COM SUCESSO", "Processo"));

		} catch (Exception e) {
			e.printStackTrace();
			r = "falhou";
			// mostrar o erro no faces
			String msg = e.getCause().toString();
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_FATAL, msg,
							" Processo"));

		}
		return r;
	}

	/**
	 * @see Metodo navegaEditarProcesso vai a pagina editarProcesso.xhtml
	 */
	public String navegaEditarProcesso() {

		FacesContext context = FacesContext.getCurrentInstance();
		Map requestParameterMap = (Map) context.getExternalContext()
				.getRequestParameterMap();
		// aqui tem que ser long porque o inteiro que ele recebe e do tipo long
		// o valor do get tem q ser igual ao valor d f:param na pagina
		// listaExtensaoProcesso.xhtml
		Long idProcesso = Long.parseLong(requestParameterMap.get("idProcesso")
				.toString());
		// this.user = userDao.getUser(userId);
		this.processoEntity = processoDao.obterPorID(idProcesso);

		transgressorId = processoEntity.getTransgressor().getIdTransgressor();
		processoEstadoId = processoEntity.getProcessoEstado()
				.getIdProcessoEstado();
		tipoNotificacaoId = processoEntity.getTipoNotificacao()
				.getIdTipoNotificacao();
		tipoMoedaId = processoEntity.getTipoMoeda().getIdTipoMoeda();

		return "editarProcesso";
	}

	/**
	 * @see Metodo apagarProcesso
	 */
	public String apagarProcesso() {
		String r = "listaProcesso";
		try {
			processoDao = (ProcessoDao) BeanFactory.getBean("processoDao",
					ProcessoDao.class);
			processoDao.remover(processoEntity);

			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"APAGOU COM SUCESSO", "Processo"));

		} catch (Exception e) {
			e.printStackTrace();
			r = "falhou";
			// mostrar o erro no faces
			String msg = e.getCause().toString();
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_FATAL, msg,
							"Processo"));

		}
		return r;
	}

	/**
	 * @see Metodo navegaApagarProcesso
	 */
	public String navegaApagarProcesso() {

		FacesContext context = FacesContext.getCurrentInstance();
		Map requestParameterMap = (Map) context.getExternalContext()
				.getRequestParameterMap();
		// aqui tem que ser long porque o inteiro que ele recebe e do tipo long
		// o valor do get tem q ser igual ao valor d f:param na pagina
		// listaProcesso.xhtml
		Long idProcesso = Long.parseLong(requestParameterMap.get("idProcesso")
				.toString());
		// this.user = userDao.getUser(userId);
		this.processoEntity = processoDao.obterPorID(idProcesso);

		transgressorId = processoEntity.getTransgressor().getIdTransgressor();
		processoEstadoId = processoEntity.getProcessoEstado()
				.getIdProcessoEstado();
		tipoNotificacaoId = processoEntity.getTipoNotificacao()
				.getIdTipoNotificacao();
		tipoMoedaId = processoEntity.getTipoMoeda().getIdTipoMoeda();

		return "apagarProcesso";
	}

	public List<SelectItem> getItemsTransgressor() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		List<Transgressor> resultado = transgressorDao.listar();
		// for (type var : arr)
		for (Transgressor teste : resultado) {
			SelectItem item = new SelectItem(teste.getIdTransgressor(),
					teste.getNome());
			//
			lista.add(item);
		}
		return lista;

	}

	public List<SelectItem> getItemsProcessoEstado() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		List<ProcessoEstado> resultado = processoEstadoDao.listar();
		// for (type var : arr)
		for (ProcessoEstado teste : resultado) {
			SelectItem item = new SelectItem(teste.getIdProcessoEstado(),
					teste.getNomeEstado());
			//
			lista.add(item);
		}
		return lista;

	}

	public List<SelectItem> getItemsTipoMoeda() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		List<TipoMoeda> resultado = tipoMoedaDao.listar();
		// for (type var : arr)
		for (TipoMoeda teste : resultado) {
			SelectItem item = new SelectItem(teste.getIdTipoMoeda(),
					teste.getMoeda());
			//
			lista.add(item);
		}
		return lista;
	}

	public List<SelectItem> getItemsTipoNotificacao() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		List<TipoNotificacao> resultado = tipoNotificacaoDao.listar();
		// for (type var : arr)
		for (TipoNotificacao teste : resultado) {
			SelectItem item = new SelectItem(teste.getIdTipoNotificacao(),
					teste.getDescricao());
			//
			lista.add(item);
		}
		return lista;
	}

	public void calculaDia() {

		// formato da data
		DateFormat df = new SimpleDateFormat("yyyy/dd/MM");
		Calendar cal = Calendar.getInstance();
		diaEntreDuasDatas=0;

		try {
			FacesContext context = FacesContext.getCurrentInstance();
			Map requestParameterMap = (Map) context.getExternalContext()
					.getRequestParameterMap();
			// aqui tem que ser long porque o inteiro que ele recebe e do tipo
			// long
			// o valor do get tem q ser igual ao valor d f:param na pagina
			// listaProcesso.xhtml
			Long idProcesso = Long.parseLong(requestParameterMap.get(
					"idProcesso").toString());

			this.processoEntity = processoDao.obterPorID(idProcesso);

			if (processoEntity.getDataEntregaNotificacao() != null) {
			
				// String converData = df.format(processoEntity.getDataEntregaNotificacao());
				String converData = df.format(processoEntity.getDataEntregaNotificacao());
				// data da defesa
				
				
				
				//dataDefesa = processoEntity.getDataEntregaNotificacao();
				dataDefesa = new Date(converData);
				//dataDefesa = df.parse(converData);
				// data do sistema
				dataSistema =  cal.getTime();
				
				
			
				
				// calcula o dia
				long dt = (dataSistema.getTime() - dataDefesa.getTime()) + 3600000;
				// poe o dia na variavel diaEntreDuasDatas
				diaEntreDuasDatas=dt/ 86400000L;
			
				System.out.println (dt / 86400000L);
				
				System.out.println("*********########### Variavel SoMA dt *******"+dt);
			} else {
				long dt = 0;
				this.setDiaEntreDuasDatas(dt);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public String getDiaCalculado() {
		String dia = "290 dias";

		return dia;
	}

	public long getDiaEntreDuasDatas() {
		return diaEntreDuasDatas;
	}

	public void setDiaEntreDuasDatas(long diaEntreDuasDatas) {
		this.diaEntreDuasDatas = diaEntreDuasDatas;
	}

	public Processo getProcessoEntity() {
		return processoEntity;
	}

	public void setProcessoEntity(Processo processoEntity) {
		this.processoEntity = processoEntity;
	}

	public ProcessoDao getProcessoDao() {
		return processoDao;
	}

	public void setProcessoDao(ProcessoDao processoDao) {
		this.processoDao = processoDao;
	}

	public Transgressor getTransgressorEntity() {
		return transgressorEntity;
	}

	public void setTransgressorEntity(Transgressor transgressorEntity) {
		this.transgressorEntity = transgressorEntity;
	}

	public TransgressorDao getTransgressorDao() {
		return transgressorDao;
	}

	public void setTransgressorDao(TransgressorDao transgressorDao) {
		this.transgressorDao = transgressorDao;
	}

	public TipoNotificacaoDao getTipoNotificacaoDao() {
		return tipoNotificacaoDao;
	}

	public void setTipoNotificacaoDao(TipoNotificacaoDao tipoNotificacaoDao) {
		this.tipoNotificacaoDao = tipoNotificacaoDao;
	}

	public ProcessoEstado getProcessoEstadoEntity() {
		return processoEstadoEntity;
	}

	public void setProcessoEstadoEntity(ProcessoEstado processoEstadoEntity) {
		this.processoEstadoEntity = processoEstadoEntity;
	}

	public ProcessoEstadoDao getProcessoEstadoDao() {
		return processoEstadoDao;
	}

	public void setProcessoEstadoDao(ProcessoEstadoDao processoEstadoDao) {
		this.processoEstadoDao = processoEstadoDao;
	}

	public TipoNotificacao getTipoNotificacaoEntity() {
		return tipoNotificacaoEntity;
	}

	public void setTipoNotificacaoEntity(TipoNotificacao tipoNotificacaoEntity) {
		this.tipoNotificacaoEntity = tipoNotificacaoEntity;
	}

	public TipoMoeda getTipoMoedaEntity() {
		return tipoMoedaEntity;
	}

	public void setTipoMoedaEntity(TipoMoeda tipoMoedaEntity) {
		this.tipoMoedaEntity = tipoMoedaEntity;
	}

	public TipoMoedaDao getTipoMoedaDao() {
		return tipoMoedaDao;
	}

	public void setTipoMoedaDao(TipoMoedaDao tipoMoedaDao) {
		this.tipoMoedaDao = tipoMoedaDao;
	}

	public Long getTransgressorId() {
		return transgressorId;
	}

	public void setTransgressorId(Long transgressorId) {
		this.transgressorId = transgressorId;
	}

	public Long getProcessoEstadoId() {
		return processoEstadoId;
	}

	public void setProcessoEstadoId(Long processoEstadoId) {
		this.processoEstadoId = processoEstadoId;
	}

	public Long getTipoNotificacaoId() {
		return tipoNotificacaoId;
	}

	public void setTipoNotificacaoId(Long tipoNotificacaoId) {
		this.tipoNotificacaoId = tipoNotificacaoId;
	}

	public Long getTipoMoedaId() {
		return tipoMoedaId;
	}

	public void setTipoMoedaId(Long tipoMoedaId) {
		this.tipoMoedaId = tipoMoedaId;
	}

}
